// 字符串S和 T 只包含小写字符。在S中，所有字符只会出现一次。

// S 已经根据某种规则进行了排序。我们要根据S中的字符顺序对T进行排序。更具体地说，如果S中x在y之前出现，那么返回的字符串中x也应出现在y之前。

// 返回任意一种符合条件的字符串T。

// 示例:
// 输入:
// S = "cba"
// T = "abcd"
// 输出: "cbad"
// 解释: 
// S中出现了字符 "a", "b", "c", 所以 "a", "b", "c" 的顺序应该是 "c", "b", "a". 
// 由于 "d" 没有在S中出现, 它可以放在T的任意位置. "dcba", "cdba", "cbda" 都是合法的输出。
// 注意:

// S的最大长度为26，其中没有重复的字符。
// T的最大长度为200。
// S和T只包含小写字符。

#include "stdc++.h"

class Solution {
public:
    string customSortString(string S, string T) {
        string res{};
        string notInS{};
        unordered_map<char, int> hash{};
        for (const char& c : T) {
            if (S.find(c) == std::string::npos) {
                notInS += c;
            } else {
                hash[c]++;
            }
        }
        
        for (const char& c : S) {
            if (hash[c] > 0) {
                res += string(hash[c], c);
            }
        }
        
        return res + notInS;
    }
};

/* 
统计 T 中每个字符出现的次数，把结果存储在数组 count 中，
count[char] 表示字符 char 出现的次数。
然后把在 S 中出现的字符按照在 S 中的相对顺序排列，剩余字符添加到当前字符串的后面，
最终排好序的字符串顺序为 S + (未在 S 中出现的字符)。
*/
class Solution {
public:
    string customSortString(string S, string T) {
        string res{};
        unordered_map<char, int> hash{};
        for (const char& c : T) {
            hash[c]++;
        }
        
        for (const char& c : S) {
            if (hash[c] > 0) {
                res += string(hash[c], c);
                hash[c] = 0;
            }
        }
        for (auto& v : hash) {
            if (v.second > 0) {
                res += string(v.second, v.first);
            }
        }
        return res;
    }
};